package com.test1;

public class Main {
  
	public static void main(String[] args) throws InterruptedException {
		test2();
	}

	/*****
	 * 原因:线程之间是不可见的，读取的是副本，没有及时读取到主内存结果。
     * 解决办法使用Volatile关键字将解决线程之间可见性,
     *  强制线程每次读取该值的时候都去“主内存”中取值
	 */
	private static void test1() throws InterruptedException {
		ThreadVolatileDemo threadVolatileDemo = new ThreadVolatileDemo();
		threadVolatileDemo.start();
		Thread.sleep(3000);
		threadVolatileDemo.setRuning(false);
		System.out.println("flag 已经设置成false");
		Thread.sleep(1000);
		System.out.println(threadVolatileDemo.flag);
		
	}
	
	/*****
	 * 测试Volatile非原子性
	 * 数据不同步，因为Volatile不用具备原子性。
	 */
	public static void test2() {
		VolatileNoAtomic[] arr = new VolatileNoAtomic[100];
		for (int i = 0; i < 10; i++) {
			arr[i] = new VolatileNoAtomic();
		}

		for (int i = 0; i < 10; i++) {
			arr[i].start();
		}
	}
	
	
}
